<?php
error_reporting(E_ALL);
date_default_timezone_set("Asia/Shanghai");

define('ROOT', str_replace('\\', '/', __DIR__).'/');
define('TOOL', ROOT.'tool/');
include(TOOL.'FSM.php');

$srcDir = ROOT.'src/'; //源目录 str_replace('\\', '/', $v);
$disDir = ROOT.'dist/';
$docDir = $disDir.'docs/';//编译后存放文件的目录

$ext = 'md';
$extension = '.md';

//==============读取文件中的所有文件
$fileList = FSM::getFiles($srcDir);
$fileList = FSM::filterFile($fileList, $extension); //找到指定后缀的文件

//获取相对路径的md5值
$filePathList = FSM::replace($srcDir, '', $fileList); //去掉前缀，得到相对地址
$filePathCodeList = FSM::makeFileCode($filePathList); 
file_put_contents($disDir.'static/file_codes.js', 'export const file_codes = '.json_encode($filePathCodeList, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)); //用于搜索等

//读取文件树, 写入js文件, 用于前端展示左侧菜单
$fileTree = FSM::getTree($srcDir);
file_put_contents($disDir.'static/file_tree.js', 'export const file_tree = '. $fileTree);

//生成页面框架
$title = '文档管理';
$indexTpl = file_get_contents($disDir.'index.tpl');
$indexHtml = str_replace(['{version}', '{title}'], [date('YmdHis'), $title], $indexTpl);
file_put_contents($disDir.'index.html', $indexHtml);

//==============获取上次编译后每个文件的md5值
$fileSignPath = ROOT.'file_sign.php'; //存放了上次编译后每个文件内容的MD5值, 变量名：$fileSignList
if (file_exists($fileSignPath)) {
    include $fileSignPath;
}
$fileSignList = !empty($fileSignList) ? $fileSignList : [];

//===============开始转移md文件 （注意 sign != $hashCode）
$newFileSign = [];
foreach ($filePathList as $path => $relpath) {
    //读取源文件, 并计算内容的md5值, 用于比对内容是否变化
    $text = file_get_contents($path);
    $sign = md5($text); //文件内容的哈希值，也可以用 md5_file(文件名)
    $newFileSign[$relpath] = $sign;
    
    // 如果上次没有编译这个文件, 或者内容已改变, 就重新编译
	if ((empty($fileSignList[$relpath]) || $fileSignList[$relpath] != $sign)) {
        $hashCode = $filePathCodeList[$relpath]; //文件路径的哈希值
        $disFileName = $docDir. $hashCode. $extension;
        file_put_contents($disFileName, $text);

        echo '编译文件: '.$relpath .PHP_EOL;
	}
}

//==================记录本次编译后，所有文件内容的hash值
file_put_contents($fileSignPath, '<?php '.PHP_EOL. '$fileSignList = '. var_export($newFileSign, true).';');

//==================删除多余的文件
$targetFileHashs = [];
$files = FSM::getDirSub($docDir);
foreach ($files as $fileName) {
    $hashCode = str_replace($extension, '', $fileName); //文件名是原路径的哈希值
    if (!in_array($hashCode, $filePathCodeList) && $hashCode != 'index') {
        $file = $docDir.$hashCode.$extension;
        unlink($file);
        echo '删除文件：'.$file.PHP_EOL;
    }
}

//生成文件的URL列表
// $fileUrlList = [];
// foreach ($objDir->fileHashList as $fn => $code) {
//     $fn = str_replace(['.md', '/'], ['', '-'], $fn);
//     //$fileUrlList[] = "- [{$fn}]({$domain}index.html?code={$code})";
//     //$fileUrlList[] = "<a href='{$domain}index.html?code={$code}'>{$fn}</a>";
//     // $fileUrlList[] = "{$fn} {$domain}index.html?code={$code}";
//     $fileUrlList[] = "{content:'{$fn}',code:'{$code}'},";
    
// }
// file_put_contents(ROOT.'file_url_list.md', implode(PHP_EOL, $fileUrlList));

echo '结束.';
